package Domain;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.joda.time.Interval;
import org.joda.time.LocalTime;
import org.uqbar.commons.model.UserException;
import org.uqbar.commons.utils.Observable;

@Observable
public class Disponibilidad {

	private LocalTime desde;
	private LocalTime hasta;
	private Dia dia;
	private Empleado empleado;

	public Disponibilidad(LocalTime desde, LocalTime hasta) {
		this.desde = desde;
		this.hasta = hasta;
	}

	public Disponibilidad() {
	}

	public void validar() {
		if (this.getHasta().isBefore(getDesde())) {
			throw new UserException(
					"no puede estar el hasta antes que el desde");
		}

	}

	public List<Dia> getDiasPosibles() {
		List<Dia> diasSinSetearDisponibilidad = new ArrayList<Dia>();
		for (Dia d : Arrays.asList(Dia.values())) {
			if (!this.getEmpleado().disponibleDia(d)) {
				diasSinSetearDisponibilidad.add(d);
			}
		}
		return diasSinSetearDisponibilidad;

	}

	public boolean evaluarHorarioPorUnLado(boolean miDesdeMenorAlDelTurno,
			boolean miDesdeIgualAlDelTurno) {
		return miDesdeMenorAlDelTurno || miDesdeIgualAlDelTurno;
	}

	public boolean contiene(LocalTime turnodesde, LocalTime turnoHasta) {
		return (this.evaluarHorarioPorUnLado(
				this.getDesde().isBefore(turnodesde),
				this.getDesde().isEqual(turnodesde)) && this
				.evaluarHorarioPorUnLado(this.getHasta().isAfter(turnoHasta),
						this.getHasta().isEqual(turnoHasta)));
	}

	public int milisEntreDosHorarios() {
		return (this.getHasta().getMillisOfDay() - this.getDesde()
				.getMillisOfDay());
	}

	// //////////////////////////////ACCESSORS///////////////////////////////////////////

	public Empleado getEmpleado() {
		return empleado;
	}

	public void setEmpleado(Empleado e) {
		this.empleado = e;
	}

	public LocalTime getDesde() {
		return desde;
	}

	public void setDesde(LocalTime desde) {
		this.desde = desde;
	}

	public LocalTime getHasta() {
		return hasta;
	}

	public void setHasta(LocalTime hasta) {
		this.hasta = hasta;
	}

	public Dia getDia() {
		return dia;
	}

	public void setDia(Dia dia) {
		this.dia = dia;
	}

	// /////////////////////////////////////////////////////////////////////////////////////////////
	// AGREGADO POR LO QUE SEMODIFICO DE LIST<DSPONIBILIDAD>

	public Interval getIntervalo() {
		return new Interval(this.getDesde().toDateTimeToday(), this.getHasta()
				.toDateTimeToday());
	}

}
